
export class ReactiveAutoSave {
    private static _ins: ReactiveAutoSave | null = null; // 单例实例
    private data: any = {}; // 存储的数据
    private readonly localStorageKey: string; // 本地存储的键名

    // 私有构造函数，防止外部直接实例化
    private constructor(localStorageKey: string, defaultValue: any = {}) {
        this.localStorageKey = localStorageKey;
        this.loadDataFromLocalStorage(defaultValue);
        this.makeDataReactive(this.data);
    }

    // 单例模式：获取实例
    public static get ins(): ReactiveAutoSave {
        if (!this._ins) {
            this._ins = new ReactiveAutoSave('gameData'); // 默认键名
        }
        return this._ins;
    }

    // 初始化单例（支持传入默认值）
    public static init(localStorageKey: string, defaultValue: any = {}) {
        // 检查 localStorage 中是否有值
        const savedData = cc.sys.localStorage.getItem(localStorageKey);
        if (!savedData || savedData === '{}') {
            // 如果没有值，则重新初始化实例
            // this._ins = new ReactiveAutoSave(localStorageKey, defaultValue);
            cc.sys.localStorage.setItem(localStorageKey, JSON.stringify(defaultValue));
        } else if (!this._ins) {
            // 如果实例不存在，则初始化实例
            this._ins = new ReactiveAutoSave(localStorageKey, defaultValue);
        }
        return this._ins;
    }

   // 加载数据
   private loadDataFromLocalStorage(defaultValue: any) {
    const savedData = cc.sys.localStorage.getItem(this.localStorageKey);
    if (savedData) {
        try {
            this.data = JSON.parse(savedData);
            console.log('数据加载成功:', this.data);
        } catch (error) {
            console.error('加载本地数据失败:', error);
            this.data = defaultValue; // 使用默认值
            this.saveDataToLocalStorage(); // 保存默认值
        }
    } else {
        this.data = defaultValue; // 使用默认值
        this.saveDataToLocalStorage(); // 保存默认值
    }
    this.makeDataReactive(this.data); // 将数据转换为响应式
}

    // 保存数据
    private saveDataToLocalStorage() {
        try {
            const dataString = JSON.stringify(this.data);
            cc.sys.localStorage.setItem(this.localStorageKey, dataString);
            console.log('数据保存成功:', this.data);
        } catch (error) {
            console.error('保存数据到本地失败:', error);
        }
    }

    // 将数据转换为响应式
    private makeDataReactive(data: any) {
        if (typeof data !== 'object' || data === null) {
            return;
        }

        for (const key in data) {
            if (data.hasOwnProperty(key)) {
                this.defineReactiveProperty(data, key, data[key]);
            }
        }
    }

    // 定义响应式属性
    private defineReactiveProperty(obj: any, key: string, value: any) {
        // 递归处理嵌套对象
        this.makeDataReactive(value);

        Object.defineProperty(obj, key, {
            enumerable: true,
            configurable: true,
            get: () => {
                return value;
            },
            set: (newValue) => {
                if (newValue !== value) {
                    console.log(`属性 ${key} 发生变化，新值为:`, newValue);
                    value = newValue;

                    // 递归处理新值
                    this.makeDataReactive(newValue);

                    // 数据变化时自动保存
                    this.saveDataToLocalStorage();
                }
            },
        });
    }

    // 获取数据
    public getData(): any {
        return this.data;
    }

    // 设置数据
    public setData(newData: any) {
        this.data = { ...newData };
        this.makeDataReactive(this.data); // 确保新数据是响应式的
        this.saveDataToLocalStorage(); // 保存数据
    }
}